盒子
盒子

instanceof的实现原理然后展开去

instanceof 是JavaScript中的一个运算符,字面意思就是判断一个势力是否属于某种类型,

1
2
3
4
const Person = function(){
}
let sjn = new Person()
sjn instanceof Person //true

这个操作符的实现原理网上已有先驱整理出一段代码,我就借花献佛。

1
2
3
4
5
6
7
8
9
10
11
function instanceOf(left,right){
let rightProto = right.prototype
let leftValue = left.__proto__
while(true){
if(leftValue === null)
return false
if(leftValue === rightProto)
return true
leftValue = leftValue.__proto__
}
}

其实这也符合MDN中对instanceof的定义:instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
上述代码为什么就是这句定义呢,那么就涉及到__proto__属性。
__proto__是在Object.prototype上的属性,暴露了通过它访问的对象的内部[[Prototype]]
哇。这么多proto,我都有点晕了呢。
我们来举个例子。
let str = new String("test")
那么str.__proto__指向内部属性[[Prototype]]也就是String.prototype,是不是很简单,
但是,使用__proto__是有争议的,也不鼓励使用它。因为它从来没有被包括在EcmaScript语言规范中,虽然现代浏览器都实现了它,但也许会在未来的某个时间停止支持。建议使用Object.getPrototypeOf()来替代。
另外,直接修改obj.__proto__是一种对性能影响非常严重的操作,因为会影响到所有继承来自[[Prototype]]的对象。